package com.srunpass.algorithm;

/**
 * 有 n 个气球，编号为0 到 n - 1，每个气球上都标有一个数字，这些数字存在数组 nums 中。
 *
 * 现在要求你戳破所有的气球。戳破第 i 个气球，你可以获得 nums[i - 1] * nums[i] * nums[i + 1] 枚硬币。 这里的 i - 1 和 i + 1 代表和 i 相邻的两个气球的序号。如果 i - 1或 i + 1 超出了数组的边界，那么就当它是一个数字为 1 的气球。
 *
 * 求所能获得硬币的最大数量。
 * @author srunpass
 * @version Id: 戳气球, v 0.1 2024/7/2 16:09 srunpass Exp $
 */
public class 戳气球 {

    public int maxCoins(int[] nums) {
        int[] val = new int[nums.length+2];
        val[0]=1;
        val[nums.length+1]=1;
        int res[][] = new int[nums.length+2][nums.length+2];
        for (int i = 0; i <nums.length; i++) {
            val[i+1]=nums[i];
        }
        for(int i=val.length-3;i>=0;i--){
            for(int j=i+2;j<val.length;j++){
                for(int k=i+1;k<j;k++){
                    int sum = val[i]*val[k]*val[j];
                    sum = sum + res[i][k]+res[k][j];
                    res[i][j] = Math.max(res[i][j],sum);
                }
            }
        }
        return res[0][val.length-1];

    }

}
